﻿//#include <iostream>
//#include <math.h>
//
//using namespace std;
//
//int n, k;
//int a[25];
//int ret, sum;
//
//bool is_num(int x)
//{
//
//}
//
//void dfs(int pos, int begin)
//{
//	if (pos > k)
//	{
//		if (is_num(sum))
//			ret++;
//		return;
//	}
//
//	for (int i = begin; i <= n; i++)
//	{
//		sum += a[i];
//		dfs(pos + 1, begin + 1);
//		sum -= a[i];
//	}
//
//}
//
//int main()
//{
//	cin >> n >> k;
//	for (int i = 1; i <= n; i++) cin >> a[i];
//
//	dfs(1, 1);
//
//	cout << ret << endl;
//
//	return 0;
//}



//#include <iostream>
//
//using namespace std;
//
//bool st[15];
//
//const int N = 15;
//int n;
//int t[N], d[N], l[N];
//
//bool dfs(int pos, int end)
//{
//	if (pos > n)
//	{
//		return true;
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		if (st[i]) 
//			continue;
//		if (end > t[i] + d[i])
//			continue;
//		int newend = max(end, t[i]) + l[i];
//		st[i] = true;
//		dfs(pos + 1, newend);
//		st[i] = false;
//	}
//	return false;
//}
//
//int main()
//{
//	int T; cin >> T;
//	while (T--) // 多组测试数据的时候，⼀定要注意清空数据 
//	{
//		memset(st, 0, sizeof st);
//		cin >> n;
//		for (int i = 1; i <= n; i++) cin >> t[i] >> d[i] >> l[i];
//		if (dfs(1, 0)) cout << "YES" << endl;
//		else cout << "NO" << endl;
//	}
//
//	return 0;
//}

//#include <iostream>
//#include <vector>
//
//using namespace std;
//
//int n, ret;
//int col[15];
//int st1[15], st2[15];
//vector<int> path;
//
//void dfs(int x)
//{
//	if (x > n)
//	{
//		ret++;
//		if (ret <= 3)
//		{
//			for (auto& e : path)
//				cout << e << " ";
//			cout << endl;
//		}
//		return;
//	}
//
//	for (int y = 1; y <= n; y++)
//	{
//		if (col[y] || st1[x - y + n] || st2[x + y])
//			continue;
//		col[y] = st1[x - y + n] = st2[x + y] = true;
//		path.push_back(y);
//		dfs(x + 1);
//		path.pop_back();
//		col[y] = st1[x - y + n] = st2[x + y] = false;
//	}
//
//}
//
//int main()
//{
//	cin >> n;
//	
//	dfs(1);
//
//	cout << ret << endl;
//
//	return 0;
//}


//#include <iostream>
//using namespace std;
//
//int n = 9;
//int a[10][10];
//
//bool row[10][10];
//bool col[10][10];
//bool st[10][10][10]; 
//
//bool dfs(int i, int j)
//{
//	if (j == n)
//	{
//		i++;
//		j = 0;
//	}
//
//	if (i == n)
//		return true;
//	if (a[i][j]) return dfs(i, j + 1);
//
//	for (int x = 1; x <= 9; x++)
//	{
//		if (col[i][x] || row[j][x] || st[i / 3][j / 3][x])
//			continue;
//
//		col[i][x] = row[j][x] = st[i / 3][j / 3][x] = true;
//		a[i][j] = x;
//
//		if (dfs(i, j + 1)) return true;
//
//		col[i][x] = row[j][x] = st[i / 3][j / 3][x] = false;
//		a[i][j] = 0;
//	}
//
//	return false;
//}
//
//int main()
//{
//
//	for (int i = 0; i < n; i++)
//	{
//		for (int j = 0; j < n; j++)
//		{
//			cin >> a[i][j];
//			int x = a[i][j];
//			if (x)
//			{
//				// 标记⼀下 
//				col[i][x] = row[j][x] = st[i / 3][j / 3][x] = true;
//			}
//		}
//	}
//
//	dfs(0, 0);
//
//	for (int i = 0; i < n; i++)
//	{
//		for (int j = 0; j < n; j++)
//		{
//			cout << a[i][j] << " ";
//		}
//		cout << endl;
//	}
//
//	return 0;
//}


//把字符串转换成整数
//https://leetcode.cn/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/

//#include <iostream>
//#include <string>
//
//using namespace std;

//class Solution
//{
//public:
//    int myAtoi(string str)
//    {
//
//        int x = 0; int comp = INT_MAX / 10;
//        int len = str.size();
//        int i = 0, sign = 1;
//
//        if (len == 0)  return 0;
//
//        for (; i < len; i++)  if (str[i] != ' ') break;
//        if (i == len)  return 0;
//
//        if (str[i] == '-') sign = -1;
//        if (str[i] == '-' || str[i] == '+') i++;
//
//        for (int j = i; j < len; j++)
//        {
//            if (str[j] - '0' < 0 || str[j] - '0' > 9)
//                break;
//            if (x > comp || (x == comp && str[j] > '7'))
//            {
//                return sign == 1 ? INT_MAX : INT_MIN;
//            }
//            x = x * 10 + (str[j] - '0');
//        }
//
//        return sign * x;
//    }
//};

//class Solution
//{
//public:
//    int hash1[26] = { 0 };
//    int firstUniqChar(string s)
//    {
//        int n = s.size();
//        for (int i = 0; i < n; i++)
//        {
//            hash1[s[i] - 'a']++;
//            if (hash1[s[i] - 'a'] > 1)
//                return s[i];
//        }
//
//        return -1;
//    }
//};


#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

//class Solution 
//{
//public:
//    string reverseStr(string s, int k) 
//    {
//        int n = s.size();
//        auto it = s.begin();
//        for (int i = 0; i < n; i += 2 * k)
//        {
//            reverse(it + i, it + min(i + k, n));
//        }
//        return s;
//    }
//};

//int main()
//{
//    string str = "abc defg";
//    //Solution s;
//    //cout << s.reverseStr(str, 2) << endl;
//    cout << str.rfind(" ") << endl;
//
//    return 0;
//}

//反转字符串中的单词
//https://leetcode.cn/problems/reverse-words-in-a-string-iii/
//class Solution
//{
//    void my_rverse(int left, int right, string& s)
//    {
//        while (left < right)
//        {
//            swap(s[left], s[right]);
//            left++, right--;
//        }
//    }
//public:
//    string reverseWords(string s)
//    {
//        int left = 0, right = 0;
//        while (right < s.size())
//        {
//            if (s[right] == ' ')
//            {
//                my_rverse(left, right - 1, s);
//                left = right + 1;
//            }
//            right++;
//        }
//
//        int pos = s.rfind(' ');
//        my_rverse(pos + 1, s.size() - 1, s);
//        return s;
//    }
//};
//
//int main()
//{
//    string str = "Let's take LeetCode contest";
//    Solution s;
//    cout << s.reverseWords(str)  << endl;
//
//    return 0;
//}


//class Solution
//{
//public:
//    string multiply(string num1, string num2)
//    {
//        int n = num1.size();
//        int m = num2.size();
//        for (int i = 0; i < n; i++)
//        {
//            for (int j = 0; j <= m; j++)
//            {
//
//            }
//        }
//    }
//};

const int N = 210;

int a[N], b[N], c[N];
int la, lb, lc;

class Solution
{
    void add(int c[], int a[], int b[])
    {
        for (int i = 0; i < la; i++)
        {
            for (int j = 0; j < lb; j++)
            {
                c[i + j] += a[i] * b[j];
            }
        }

        for (int j = 0; j < lc; j++)
        {
            c[j + 1] += c[j] / 10;
            c[j] = c[j] % 10;
        }

        while (lc > 1 && c[lc - 1] == 0) lc--;
    }

public:
    string multiply(string num1, string num2)
    {
        string s;
        la = num1.size();
        lb = num2.size();
        lc = la + lb;
        for (int i = 0; i < la; i++)
        {
            a[la - 1 - i] = num1[i] - '0';
        }
        for (int i = 0; i < lb; i++)
        {
            b[lb - 1 - i] = num2[i] - '0';
        }
        add(c, a, b);

        for (int i = lc - 1; i >= 0; i--)
            s += (c[i] + '0');

        return s;
    }
};

int main()
{
    Solution s;
    cout << s.multiply("123", "456") << endl;

    return 0;
}